package com.xygz.orm.utils;

import com.xiyuan.smartutils.StrUtils;
import com.xygz.orm.constants.ORMConstants;

import java.util.Locale;

/**
 *
 * @author xiyuan-lgz 2023-09-18 @version v1.0.0 新建与整理
 */
@SuppressWarnings("all")
public class S implements ORMConstants {
    public static String trim(String str) {
        if (str == null) {
            return null;
        }
        
        int len = str.length() - 1, start = 0, end = len;
        while (end > start && isWhitespace(str.charAt(end))) {end--;}
        while (start <= end && isWhitespace(str.charAt(start))) {start++;}
        return end == len && start == 0 ? str : str.substring(start, end + 1);
    }
    
    
    /**
     * 去除前后空白，如果字符串=null，则返回指定的缺省值，支持去除中文空格12288和BOM65279
     */
    public static String trim(String s, String defaultValue) {
        return (s == null) ? defaultValue : trim(s);
    }
    
    /**
     * 删除前后缀字符串，如果存在的话
     *
     * @param s      被删除的字符串
     * @param prefix 前缀字符串
     * @param suffix 后缀字符串
     * @return 删除后的字符串
     */
    public static String trim(String s, String prefix, String suffix) {
        if (isEmpty(s)) {
            return s;
        }
        
        int s1 = 0, s2 = s.length();
        boolean flag = false;
        if (!isEmpty(prefix) && s.startsWith(prefix)) {
            s1 = prefix.length();
            flag = true;
        }
        
        if (!isEmpty(suffix) && s.endsWith(suffix)) {
            s2 -= suffix.length();
            flag = true;
        }
        
        return !flag ? s : s.substring(s1, s2);
    }
    
    /**
     * @param str
     * @return
     */
    public static String trimToNull(String str) {
        str = trim(str);
        return str == null || str.isEmpty() ? null : str;
    }
    
    
    /**
     * @param str
     * @return
     */
    public static String trimToEmpty(String str) {
        return trim(str, "");
    }
    
    /**
     * 检查字符串是否为空，null或空字符串
     *
     * @param s 字符串
     * @return true|false
     */
    public static boolean isEmpty(String s) {
        return s == null || s.isEmpty();
    }
    
    /**
     * @param s
     * @return
     */
    public static boolean isBlank(String s) {
        int i = 0, l = s == null ? 0 : s.length();
        while (i < l && isWhitespace(s.charAt(i))) i++;
        return i == l;
    }
    
    /**
     * @param c
     * @return
     */
    public static boolean isWhitespace(char c) {
        return c <= _SPACE_ || c == _SPACE_ZH_ || c == _SPACE_BOM_ || c == _SPACE_EN_ || c == _SPACE_IDEOGRAPHIC_;
    }
    
    /**
     * @param s
     * @param prefix
     * @return
     */
    public static boolean startsWith(String s, String prefix) {
        if (s == null) {
            return prefix == null;
        }
        
        if (prefix == null || prefix.length() > s.length()) {
            return false;
        }
        
        int i = 0, l = prefix.length();
        while (i < l && prefix.charAt(i) == s.charAt(i)) {i++;}
        return i == l;
    }
    
    /**
     * @param s
     * @param suffix
     * @return
     */
    public static boolean endsWith(String s, String suffix) {
        if (s == null) {
            return suffix == null;
        }
        
        if (suffix == null || suffix.length() > s.length()) {
            return false;
        }
        
        int i = 0, l = suffix.length(), offset = s.length() - suffix.length();
        while (i < suffix.length() && suffix.charAt(i) == s.charAt(offset + i)) {i++;}
        return i == l;
    }
    
    
    /********************************************/
    // 以下为String的静态方法
    /********************************************/
    
    /**
     * 格式化，有%s, %d, %f等
     *
     * @param format 格式，比如 "您已成功注册到%s，用户名：%s，密码：%s，请登录..."
     * @param args   参数列表，比如 {"系统","张三","111111"};
     * @return 格式化后的内容，例子的内容则为： "您已成功注册到系统，用户名：张三，密码：111111，请登录..."
     */
    public static String format(String format, Object... args) {
        return String.format(format, args);
    }
    
    /**
     * @param l
     * @param format
     * @param args
     * @return
     */
    public static String format(Locale l, String format, Object... args) {
        return String.format(l, format, args);
    }
    
    /**
     * 格式化，支持{}转化为%s，再作format处理，（即：注意如果pattern中有%s,%d等也会生效）
     *
     * @param pattern   模式，比如 "您已成功注册到{}，用户名：{}，密码：{}，请登录..."
     * @param arguments 参数列表，比如 ["系统","张三","111111"];
     * @return 格式化后的内容，例子的内容则为： "您已成功注册到系统，用户名：张三，密码：111111，请登录..."
     */
    public static String formats(String pattern, Object... arguments) {
        if (isBlank(pattern) || arguments == null || arguments.length == 0) {
            return pattern;
        }
        
        if (pattern.indexOf("{}") != -1) {
            pattern = pattern.replaceAll("\\{\\}", "%s");
        }
        
        return String.format(pattern, arguments);
    }
    
    /**
     * 转换为布尔型，支持[true|false|yes|no|1|0|on|off]
     *
     * @param s 字符串
     * @return true|false
     */
    public static boolean toBoolean(String s) {
        return StrUtils.toBoolean(s);
    }
    
    /**
     * 字符串(unicode)转为UTF-8的字节数组，各语言通用
     *
     * @param str 字符串unicode双字节
     * @return 字节数组，单、双、三、四 字节转换
     */
    public static byte[] toUTF8(String str) {
        return StrUtils.toUTF8(str);
    }
    
    /**
     * 从sources 查找字符串 使用equals算法查找集合项
     *
     * @param target  目标字符串
     * @param sources 集合列表
     * @return true|false
     */
    public static boolean find(String target, CharSequence... sources) {
        return StrUtils.find(target, sources);
    }
}
